/**
 * @file codeforces/1677/c/main.cpp
 * @brief 给定两个各有 n 种颜色的彩带，为每一个颜色1 to n中一赋值，形成一个排列
 * 记录两个序列的值为 a[] 和 b[]，  s.t. max(sum(|a[i]-b[i]))
 *
 * 最优构造法如下：对于一个颜色环（一个数字的轮换），这样赋值：最大值、最小值，次大值
 * 次小值……如果环长度为奇数那么最后一个数赋值为中位数，这个数字不做贡献。
 *
 * 显然，每一个“山峰”产生 2*h[i]的贡献，每一个“山谷”产生abs(-a*h[i])的贡献，
 * 对于长度大小为circleSize的环，山峰和山谷一共有floor(circleSize/2)个。
 *
 * @see https://codeforces.com/problemset/problem/1677/C
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @copyright 2022
 * @date 2022/5/15 10:40:39
 * @todo: 为什么这么折腾，最终答案却只与环的长度的一半有关系？
 **/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll output;
const int N = 100010;
bool vis[N];
int cnt = 0;

ll c;
int n, color[2][N],  // 两种颜色
    col_to_pos[N];   // 颜色到位置的映射
void dfs(int pos) {
  if (vis[pos]) return;
  vis[pos] = true;
  ++cnt;
  dfs(col_to_pos[color[0][pos]]);
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) vis[i] = false;
    for (int i = 1; i <= n; ++i) scanf("%d", &color[0][i]);
    for (int i = 1; i <= n; ++i) {
      scanf("%d", &color[1][i]);
      col_to_pos[color[1][i]] = i;  // b 中第 color[i]种颜色对应的位置
                                    // 通过 a 的颜色查 b 具有该颜色的元素的下标
    }

    c = 0;
    for (int i = 1; i <= n; ++i) {
      cnt = 0;
      dfs(i);  // 每次找一个环
      c += cnt / 2;  // 加上环的长度 / 2（如果 cnt 是奇数，忽略余数 1）
    }
    printf("%lld\n", (c * (n - c)) * 2);
  }
}
